package LeetCodeTest.PrimaryAlgorithmTest.Array;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

public class LongestConsecutive {
    /**
     * 最长连续数列
     * 给定一个未排序的整数数组 nums ，找出数字连续的最长序列（不要求序列元素在原数组中连续）的长度。
     * 示例 1：
     * 输入：nums = [100,4,200,1,3,2]
     * 输出：4
     * 解释：最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
     * 示例 2：
     * 输入：nums = [0,3,7,2,5,8,4,6,0,1]
     * 输出：9
     * 提示：
     * 0 <= nums.length <= 104
     * -109 <= nums[i] <= 109
     * 进阶：可以设计并实现时间复杂度为 O(n) 的解决方案吗？
     * <p>
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode-cn.com/problems/WhsWhI
     * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
     */
    public static void main(String[] args) {
        LongestConsecutive longestConsecutive = new LongestConsecutive();
        //        int[] nums = {0,3,7,2,5,8,4,6,0,1};
        //        int[] nums = {100,4,200,1,3,2};
        int[] nums = {9, 1, 4, 7, 3, -1, 0, 5, 8, -1, 6};
        System.out.println(longestConsecutive.longestConsecutive(nums));
    }

    /**
     * 思路：先排序，然后遍历找出最长连续的长度
     * @param nums
     * @return
     */
    //    public int longestConsecutive(int[] nums) {
    //        if (nums.length == 0){
    //            return 0;
    //        }
    //        TreeSet<Integer> temp = new TreeSet<>();
    //        for (int num : nums) {
    //            temp.add(num);
    //        }
    //        int maxCount = 1;
    //        int count = 1;
    //        int tempNum = temp.first();
    //        temp.remove(tempNum);
    //        while (temp.size()>0) {
    //            if (temp.first() == tempNum+1){
    //                count++;
    //            }else {
    //                if (maxCount < count){
    //                    maxCount = count;
    //                }
    //                count = 1;
    //            }
    //            tempNum = temp.first();
    //            temp.remove(tempNum);
    //        }
    //        if (maxCount < count){
    //            maxCount = count;
    //        }
    //        return maxCount;
    //    }

    /**
     * 思路：双指针，遍历数组，放入HashMap map，取数组第一个数字a，map是否能get出比a大1的对象，是count++，否则get比a小1的数，
     */
    public int longestConsecutive(int[] nums) {
        Set<Integer> num_set = new HashSet<Integer>();
        for (int num : nums) {
            num_set.add(num);
        }

        int longestStreak = 0;

        for (int num : num_set) {
            if (!num_set.contains(num - 1)) {
                int currentNum = num;
                int currentStreak = 1;

                while (num_set.contains(currentNum + 1)) {
                    currentNum += 1;
                    currentStreak += 1;
                }

                longestStreak = Math.max(longestStreak, currentStreak);
            }
        }

        return longestStreak;
    }
}
